package autogenerator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

public class MybatisPlusAutoGenerator {

    private static final Properties prop = new Properties();

    static {
        InputStream resourceAsStream = ClassLoader.getSystemResourceAsStream("mybatisPlusAutoGenerator.properties");
        try {
            prop.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args)  {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        GlobalConfig globalConfig = setGlobalConfig();
        mpg.setGlobalConfig(globalConfig);
        DataSourceConfig dataSourceConfig = initDB();
        mpg.setDataSource(dataSourceConfig);
        PackageConfig packageConfig = getPackageConfig();
        mpg.setPackageInfo(packageConfig);

        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
            }
        };
        List<FileOutConfig> fileOutConfig = getFileOutConfig(globalConfig.getOutputDir());
        cfg.setFileOutConfigList(fileOutConfig);
        mpg.setCfg(cfg);


        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);

        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setInclude(prop.getProperty("autogenerator.jdbc.tables"));
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();



    }


    private static  PackageConfig getPackageConfig(){
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(prop.getProperty("autogenerator.parentpackage"));
        return pc;
    }


    private static GlobalConfig setGlobalConfig(){
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(prop.getProperty("autogenerator.outputdir")+"\\java");
        globalConfig.setAuthor("author");
        globalConfig.setOpen(false);
        globalConfig.setSwagger2(Boolean.parseBoolean(prop.getProperty("autogenerator.atswagger")));
        return globalConfig;
    }

    /**
     * 數據庫連接信息
     * @return
     */
    private static DataSourceConfig initDB(){
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
        dataSourceConfig.setUrl(prop.getProperty("autogenerator.jdbc.url"));
        dataSourceConfig.setUsername(prop.getProperty("autogenerator.jdbc.username"));
        dataSourceConfig.setPassword(prop.getProperty("autogenerator.jdbc.password"));
        return dataSourceConfig;
    }


    private static List<FileOutConfig> getFileOutConfig(String outputDir){
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出

        focList.add(new FileOutConfig("/templates/query.java.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return outputDir + "/com/qooapp/entity/query/" + tableInfo.getEntityName() + "Query.java";
            }
        });


//        focList.add(new FileOutConfig("/templates/controller.java.ftl") {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return outputDir + "/com/qooapp/controller/" + tableInfo.getEntityName() + "Controller.java";
//            }
//        });
//
//        focList.add(new FileOutConfig("/templates/query.java.ftl") {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return outputDir + "/com/qooapp/entity/query/" + tableInfo.getEntityName() + "Query.java";
//            }
//        });
//
//        focList.add(new FileOutConfig("/templates/service.java.ftl") {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return outputDir + "/com/qooapp/service/" + tableInfo.getEntityName() + "Service.java";
//            }
//        });
//
//        focList.add(new FileOutConfig("/templates/serviceImpl.java.ftl") {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return outputDir + "/com/qooapp/service/impl" + tableInfo.getEntityName() + "ServiceImpl.java";
//            }
//        });
//
//        focList.add(new FileOutConfig("/templates/mapper.java.ftl") {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return outputDir + "/com/qooapp/mapper/" + tableInfo.getEntityName() + "Mapper.java";
//            }
//        });
//
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return prop.getProperty("autogenerator.outputdir") + "/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
            }
        });

        return focList;
    }
}
